iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

題目說明

給定一個包含括號且只有加減法的運算式,回傳計算後的結果

解法說明

basic calculator 總共有四個題組,這是第一個,因為需考慮到括號內的內容要先算,所以要考慮的事就變多了
初始化:

  • result = 0: 用來放最後結果的值
  • current = 0: 當前的數值
  • sign = 1: 記錄正負號
  • stack = []: 用來暫存待計算的值
    遍歷整個字串,逐一處理每個 char:
  1. 當遇到數字: 由於數字的範圍可能超過 10 位數以上,所以當遇到每一個數字,會需要把先前紀錄的數字 * 10 後再加上當前的 char -> 由此可知我們會需要一個紀錄當前數字的值 current
  2. 當遇到 + 或 -: 代表先前紀錄的數值已經可以進行加總了,這時會需要把 current 與先前的 sign 相乘後與 output 相加,再把 sign 依照 + - 號 assign 給 sign,當 c = '+', sign = 1; c = '-'; sign = -1
  3. 當遇到 (: 把目前計算好的數值與正負號(1/-1) 放到 stack ,等遇到 ) 時會再拿出來計算,初始化 output 與 sign
  4. 當遇到 ): 把先前紀錄的 current 加總給 output ,這時 output 已經會是整個括號內計算後的結果,接著會瘀要把這個結果與先前計算好的值加總,因此會把先前在左括號時放入的 sign 與 output 倒出來加到 output 中,再把 current 歸零

最後再把 current 與 output 結合即可

程式碼

class Solution:
    def calculate(self, s: str) -> int:
        output, curr, sign, stack = 0,0,1,[]
        
        for c in s:
            # digit
            if c.isdigit():
                curr = curr*10 + int(c)
            elif c == '-' or c == '+':
                output += sign * curr
                sign = -1 if c == '-' else 1
                curr = 0
            elif c == '(':
                stack.append(output)
                stack.append(sign)
                output = 0
                sign = 1
            elif c == ')':
                output += curr*sign
                output *= stack.pop()
                output += stack.pop()
                
                curr = 0
            else:
                continue
        return output + sign*curr

上一篇
Day 22 - 225. Implement Stack using Queues
下一篇
Day 24 - 227. Basic Calculator II
系列文
Leetcode 習慣養成之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言